/*
 * @Author: 姚潘涛
 * @Date: 2024-04-08 20:36:39
 * @LastEditors: 姚潘涛
 * @LastEditTime: 2024-04-10 09:22:31
 * @FilePath:
 * /xict_ws/src/xcmg-intelligent-cockpit-three/src/xict_ui/include/xict_ui_driver/utils/sub_sdk_define.h
 * @Description:
 *
 * Copyright (c) 2024 by pandaman, All Rights Reserved.
 */
#pragma once

#ifndef ENABLE_SUB_FUNCTION_NAME
#define ENABLE_SUB_FUNCTION_NAME(func_name) Enable##func_name##Subscriber
#endif

#ifndef DISABLE_SUB_FUNCTION_NAME
#define DISABLE_SUB_FUNCTION_NAME(func_name) Disable##func_name##Subscriber
#endif

#ifndef SET_CB_FUNCTION_NAME
#define SET_CB_FUNCTION_NAME(func_name) Set##func_name##Callback
#endif

#ifndef DEFAULT_SIGNALS_NAME
#define DEFAULT_SIGNALS_NAME(func_name) signal##func_name
#endif

#ifndef DEFAULT_CB_FUNCTION_NAME
#define DEFAULT_CB_FUNCTION_NAME(func_name) Default##func_name##Callback
#endif

// 函数申明
#define DECLARE_SDK_SUB_FUNC(func_name, callback_type, msg_type)  \
public:                                                           \
    void ENABLE_SUB_FUNCTION_NAME(func_name)();                   \
    void DISABLE_SUB_FUNCTION_NAME(func_name)();                  \
    void SET_CB_FUNCTION_NAME(func_name)(callback_type callback); \
                                                                  \
private:                                                          \
    void DEFAULT_CB_FUNCTION_NAME(func_name)(const char* topic,   \
                                             const msg_type& msg)

#define DEFINE_SDK_ENABLE_FUNC(func_name, sub_type, sub, topic)             \
    void ImageSdk::ENABLE_SUB_FUNCTION_NAME(func_name)() {                  \
        sub = sub_type(topic);                                              \
        sub.AddReceiveCallback(                                             \
            std::bind(&ImageSdk::DEFAULT_CB_FUNCTION_NAME(func_name), this, \
                      std::placeholders::_1, std::placeholders::_2));       \
    }

#define DEFINE_SDK_DISABLE_FUNC(func_name, sub)             \
    void ImageSdk::DISABLE_SUB_FUNCTION_NAME(func_name)() { \
        sub.Destroy();                                      \
    }

#define DEFINE_SDK_SET_CALLBACK_FUNC(func_name, callback_type, callback_name) \
    void ImageSdk::SET_CB_FUNCTION_NAME(func_name)(callback_type callback) {  \
        if (!CheckAndSetCallback(callback, callback_name))                    \
            qDebug() << "SET" #func_name " Callback failed, nullptr";         \
    }

#define DEFINE_SDK_DEFAULT_CALLBACK_FUNC(func_name, msg_type, callback_name)  \
    void ImageSdk::DEFAULT_CB_FUNCTION_NAME(func_name)(const char* topic,     \
                                                       const msg_type& msg) { \
        if (callback_name == nullptr)                                         \
            qDebug() << "Default " #func_name " Callback";                    \
        else                                                                  \
            callback_name(topic, msg);                                        \
    }

// 函数定义
#define DEFINE_SDK_SUB_FUNC(func_name, sub_type, sub, topic, callback_type, \
                            callback_name, msg_type)                        \
    DEFINE_SDK_ENABLE_FUNC(func_name, sub_type, sub, topic)                 \
    DEFINE_SDK_DISABLE_FUNC(func_name, sub)                                 \
    DEFINE_SDK_SET_CALLBACK_FUNC(func_name, callback_type, callback_name)   \
    DEFINE_SDK_DEFAULT_CALLBACK_FUNC(func_name, msg_type, callback_name)
